/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import java.sql.*;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author v3550
 */
public class UsuarioDAO {

    public UsuarioDAO() throws DAOException {
       try {
             Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        } catch (ClassNotFoundException ex) {
            throw new DAOException("JdbcOdbDriver not found!!");
        }
    }
   
    private static Connection getConnection() throws SQLException {
        //derbyDB sera o nome do diretorio criado localmente
        return DriverManager.getConnection("jdbc:derby:derbyDB");
    }

    public UsuarioDTO gravar(UsuarioDTO c) throws DAOException {
       
        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();
            String sql = "INSERT INTO USUARIO (NOME, EMAIL) VALUES ("
                    + "'" + c.getNome() + "',"
                    + "'" + c.getEmail() +"'"
                    + ")";
            sta.executeUpdate(sql);
            
            sta.close();
            con.close();
            if(setCodigo(c))
                return c;
        } catch (SQLException ex) {
            throw new DAOException(ex.getMessage());
        }
        return null;     
    }
    
    private boolean setCodigo(UsuarioDTO p) throws DAOException {
        try {
            Connection con = getConnection();
            PreparedStatement stmt = con.prepareStatement(
                    "SELECT ID FROM USUARIO WHERE UCASE(NOME)=? AND UCASE(EMAIL) = ?" 
                    );
            stmt.setString(1, p.getNome().toUpperCase());
            stmt.setString(2, p.getEmail().toUpperCase());
            
            ResultSet resultado = stmt.executeQuery();
            if(resultado.next()) {
                int codigo = resultado.getInt("ID");
                p.setId(codigo);
                return true;
            }
            
        } catch (SQLException ex) {
            throw new DAOException("Falha ao adicionar. ->" + ex.getMessage());
        }
        return false;
    }
    
    public List<UsuarioDTO> getUsuarios() throws DAOException {
          UsuarioDTO usuario = null;
          List<UsuarioDTO> list = new LinkedList<UsuarioDTO>();

        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();

            String sql ="SELECT ID, NOME, EMAIL FROM USUARIO ";
            ResultSet res = sta.executeQuery(sql);
            
            while (res.next()) {
                usuario = new UsuarioDTO();
                usuario.setNome(res.getString("NOME"));
                usuario.setEmail(res.getString("EMAIL"));
                usuario.setId(Integer.parseInt(res.getString("ID")));
                list.add(usuario);
                
            }
            res.close();
            sta.close();
            con.close();
        } catch (Exception ex) {
            throw new DAOException(ex.getMessage());
        }

        return list;
    }
    
        public List<UsuarioDTO> getUsuariosNaoDeuOLance(ArtigoDTO a) throws DAOException {
          UsuarioDTO usuario = null;
          List<UsuarioDTO> list = new LinkedList<UsuarioDTO>();

        try {
            Connection con = getConnection();
            Statement sta = con.createStatement();

            String sql ="SELECT ID, NOME, EMAIL FROM USUARIO WHERE ID NOT IN (" + a.getUsuario()+")";
            ResultSet res = sta.executeQuery(sql);
            
            while (res.next()) {
                usuario = new UsuarioDTO();
                usuario.setNome(res.getString("NOME"));
                usuario.setEmail(res.getString("EMAIL"));
                usuario.setId(Integer.parseInt(res.getString("ID")));
                list.add(usuario);
                
            }
            res.close();
            sta.close();
            con.close();
        } catch (Exception ex) {
            throw new DAOException(ex.getMessage());
        }

        return list;
    }

    
    
}
